/** Fichier définissant un cylindre.
 *
 * Ce fichier contient la déclaration de la classe Cylindre.
 *
 * @file Cylindre.hpp
 * @author Johan "Solo" Luisier
 * @date 2005
 */
#ifndef CYLINDRE_HPP
#define CYLINDRE_HPP


#include "FormeComposee.hpp"

#include "Plan.hpp"
#include "BaseCylindre.hpp"

/** Classe implémentant le cylindre pour le raytracing.
 *
 * Cette classe implémente le cylindre pour le raytracing. Le cylindre est
 * défini dans un référentiel local, où son axe de symétrie est toujours
 * orienté selon Oz.
 *
 * Le cylindre est définit comme l'intersection d'une instance de BaseCylindre
 * et de deux instances de Plan.
 *
 * Forme::PseudoCentre est défini comme le centre de gravité du
 * Cylindre.
 *
 * @author Johan "Solo" Luisier
 * @date 2005
 *
 * @class Cylindre "Cylindre.hpp" "Formes/Cylindre.hpp"
 */
class Cylindre : public FormeComposee
{
public:
    // constructeurs et destructeurs
    Cylindre();
    Cylindre(const Vecteur& v, const Coord& a, const double& r,
             const double& h);
    ~Cylindre();

    const VecteurU& axe() const;
    const Coord& point() const;
    const double& rayon() const;
    const double& hauteur() const;

private:
    /**
     * Centre du cylindre, qui est le centre de gravité du solide.
     */
    Coord Centre;
    /**
     * Hauteur du cylindre.
     */
    double Hauteur;
    /**
     * Liste des 2 instances de Plan nécessaires pour la création d'un
     * Cylindre
     */
    std::vector< Plan::SharedPtr > ListPlan; // liste les 8 plans
    /**
     * Instance de FormeComposee intermédiaire nécessaire à la
     * définition du cylindre.
     */
    BaseCylindre::SharedPtr BCylindre;
};

#endif // CYLINDRE_HPP
